package com.kabigon.tiny.test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xu.biao
 * @version v1.0
 * @Package com.kabigon.tiny.test
 * @data 2023-06-19 22:42
 */
public class Chunk {
    public static void main(String[] args) {
        //将超过1024个字符的content字段按照标点符号或每1024个字符进行分割，并存储到数组中
        // 将content字段的值赋给该变量
        String content = "这个月因为自身的感情问题（其实属于单相思），导致了半个多月的无心学习状态，自己也是一直在自我的内耗里，总是走不出那种迷茫和痛苦里。我或许真的爱上你了啊？不过时间拉长，很多东西也放下，包括我哥找了公司的心理咨询给我，开始想明白很多事情，还有自己人生的一些思考和指导。虽然说现在还没有完全恢复过来，但，想以此总结一下这次心理咨询的内容，调整回来，找到自己。";

        int chunkSize = 1024;

        List<String> chunks = new ArrayList<>();
        int contentLength = content.length();
        int startIndex = 0;

        while (startIndex < contentLength) {
            int endIndex = Math.min(startIndex + chunkSize, contentLength);
            String chunk = content.substring(startIndex, endIndex);

            if (endIndex < contentLength) {
                //获取最后一个标点符号的索引位置
                //从子字符串的末尾开始向前搜索，找到第一个标点符号的索引位置
                int lastPunctuationIndex = getLastPunctuationIndex(chunk);
                //检查最后一个标点符号的索引位置，如果存在，则将子字符串截断到最后一个标点符号的位置
                if (lastPunctuationIndex != -1) {
                    chunk = chunk.substring(0, lastPunctuationIndex + 1);
                    //将每个子字符串添加到chunks列表中，并更新起始索引
                    endIndex = startIndex + lastPunctuationIndex + 1;
                }
            }

            chunks.add(chunk);
            startIndex = endIndex;
        }

        String[] chunksArray = chunks.toArray(new String[0]);


    }

    // 判断字符是否为中文标点符号
    private static boolean isChinesePunctuation(char c) {
        return String.valueOf(c).matches("[\u3000-\u303F\uFF00-\uFFEF]");
    }

    // 判断字符是否为标点符号
    private static boolean isPunctuation(char c) {
        return !Character.isLetterOrDigit(c);
    }

    // 获取子字符串中最后一个标点符号的索引位置
    private static int getLastPunctuationIndex(String str) {
        for (int i = str.length() - 1; i >= 0; i--) {
            if (isChinesePunctuation(str.charAt(i))) {
                return i;
            }
        }
        return -1;
    }
}
